#include <stdio.h>
#include <string.h>
#define N 32

typedef struct {
    int id;
    char name[N];
}MSG;

int main(int argc, char const *argv[])
{
    FILE* fp = NULL;
    char buf[N] = {0};
    long offset = 0;
    MSG msg = {1001,"ebaina"};

    if((fp = fopen("file.txt","w+")) == NULL){ //在当前目录下创建一个可读可写file.txt文件，文件存在则清空，不存在则创建，返回文件流指针fp
        fprintf(stderr,"fopen failed"); //把错误输出到标准错误流中(无缓冲)
        return -1;
    }
    
    if(fputs("hello world!",fp) == EOF){ //往file.txt文件中写入hello world!
        fprintf(stderr,"fputs failed");
        return -2;
    }

    if((offset = ftell(fp)) < 0){ //获取文件读写指针当前位置
        fprintf(stderr,"ftell failed");
        return -3;
    }
    printf("offset = %ld\n",offset);
    if(fseek(fp,-offset,SEEK_END) < 0){ //设置文件读写指针位置回到文件开始位置
        fprintf(stderr,"fseek failed");
        return -4;
    }

    if(fgets(buf,sizeof(buf),fp) == NULL){ //读取file.txt文件到buf中
        fprintf(stderr,"fgets failed or reach file.txt of end");
        return -5;
    }
    printf("buf = %s\n",buf); //打印buf数据终端显示

    offset = ftell(fp); //获取文件读写指针当前位置
    fseek(fp,-offset,SEEK_END); //设置文件读写指针位置回到文件开始位置

    fwrite(&msg,sizeof(MSG),1,fp); //把msg结构体写入file.txt文件
    offset = ftell(fp); //获取文件读写指针当前位置
    fseek(fp,-offset,SEEK_END); //设置文件读写指针位置回到文件开始位置
    memset(&msg,0,sizeof(MSG)); //清空msg结构体
    fread(&msg,sizeof(MSG),1,fp); //读取file.txt文件中的内容到msg结构体中
    printf("msg.id = %d,msg.name = %s\n",msg.id,msg.name); //打印msg结构体数据

    fclose(fp); //关闭文件流指针fp    
    return 0;
}
